<?php
/**
 * Klasse zur Validierung von Variablen und Variablenarrays
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2013 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */

Class Yapary_Parameter_Parameter
{
    /** @desc Speichert die zuletzt benutze Validierungsklasse */
    private $classValidation;
    /** @var Speichert alle vorgenommenen Validierungsinformationen im Format array[] = $errno */
    private $arrStatusHistory = array();
    private $status           = NULL;

	function __construct ()
	{

	}


	/**
	* Validiert die "Values" eines Arrays auf Gueltigkeit
	* @param mixed $arrayToValidate	: Die zu pruefende Variable
	* @param mixed $defaultValue 	: Standardwert, falls Variable nicht existent oder ueberpruefung ungueltig
	* @param Class $classValidation : eine der Parameter... Validierungsklassen
	* @return mixed : Wert oder defaultwert
	*/
	public function getArray ( $arrayToValidate, $defaultValue = NULL, $oValidator )
	{
	    $arrResult = array();

	    if (count($arrayToValidate)) {
	        while (list($key,$val) = each($arrayToValidate)) {
	            $arrResult[$key] = $this->getParam($val, $defaultValue, $oValidator);
	        }
	    }

	    return $arrResult;
	}


	/**
	* Prueft eine Variable auf Gueltigkeit
	* @param mixed $paramToValidate	: Die zu pruefende Variable
	* @param mixed $defaultValue 	: Standardwert, falls Variable nicht existent oder ueberpruefung ungueltig
	* @param Class $classValidation : eine der Parameter... Validierungsklassen
	* @return mixed : Wert oder defaultwert
	*/
	public function getParam ( $paramToValidate, $defaultValue = NULL, $oValidator )
	{
		$this->status = NULL;
		$this->classValidation = NULL;
	    // Validierungsklassen ueberpruefen, Fehlererkennung uebertragen und Wert ausgeben

		if (!is_object($oValidator)) {
			throw new Exception('Parameter 3 muss eine Instanz einer Validierungsklasse sein');
		}

		$o = new ReflectionClass($oValidator);
		if (!$o->isSubclassOf('Yapary_Exception_Error')) {
			throw new Exception('Validierungsklasse ist nicht abgeleitet von ParameterStatus');
		}

		if (!$o->implementsInterface('Yapary_Parameter_ICheck')) {
			throw new Exception('Validierungsklasse ist keine abgeleitete Klasse von Yapary_Parameter_ICheck');
		}


		$this->classValidation = $oValidator;
		if ($oValidator->isValid($paramToValidate)) {
		    $this->status = $this->arrStatusHistory[] = $oValidator->getLastError();
        	return $oValidator->typedef($paramToValidate);
		}

	    $this->status = $this->arrStatusHistory[] = $oValidator->getLastError();
        return $defaultValue;
	}


	/**
	 * Gibt den zuletzt erzeugten Status einerValidierung zurueck
	 * @return string|NULL
	 * */
	public function getStatus ()
	{
	    return $this->status;
	}

	/**
	 * Gibt die gespeicherten Validierungsinformationen in der Aufrufreihenfolge aus
	 * @return array() : array[] = $errno
	 * */
	public function getStatusHistory()
	{
	    return $this->arrStatusHistory;
	}

}




/*
$oParam = new Parameter();
echo $oParam->getParam($var = 10, NULL, $p = new Yapary_Parameter_CheckNumeric(2,9));
echo $p->getStatus();
*/
?>